package com.platform.modules.mall.activity.rule;

import com.platform.modules.mall.entity.MallGoodsToActivityEntity;
import java.math.BigDecimal;
import java.util.*;
import org.apache.commons.collections4.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 抽取商品
 * 根据活动商品关系表中的中奖概率进行抽奖，设置的概率越高，中奖的概率越高
 * 概率数字和不限制在100,根据所有的概率和生成随机数
 */
public class DrawGoodsUtil extends RuleAbstract{

    /**
     * 所有奖项概率总合，用于计算随机数，在次范围内计算随机值
     */
    private BigDecimal countNum=new BigDecimal("0");

    /**
     * 使用这个类的时候，list的创建方式不能使用Arrays.asList(g1,g2,g3,g4);
     * 该方式实现时有一些方法没有实现，在remove时会出现异常
     * @param list  所有参与抽奖的对象
     */
    public DrawGoodsUtil(List<MallGoodsToActivityEntity> list){
        super(list);
        list.forEach(x->countNum=countNum.add(x.getProbability()));
    }

    /**
     * 去除没有库存的商品
     * @param entity    需要删除的对象
     */
    @Override
    public void delEntity(MallGoodsToActivityEntity entity){
        super.delEntity(entity);
        countNum=countNum.subtract(entity.getProbability());
    }

    /**
     * 随机抽取商品
     * @return
     */
    @Override
    public MallGoodsToActivityEntity getEntity(){
        /*没有商品可以抽了，直接返回null*/
        if (CollectionUtils.isEmpty(entityList)){
            return null;
        }
        /*生成随机数*/

        int num = new Random().nextInt(countNum.intValue())+1;
        BigDecimal count=new BigDecimal("0");
        BigDecimal ling = new BigDecimal("0");
        for (MallGoodsToActivityEntity entity:entityList) {

            /*中奖概率为0不参与抽奖*/
            if (ling.compareTo(entity.getProbability())!=-1){
                continue;
            }
            /*计算该商品的中奖范围*/
            count=count.add(entity.getProbability());
            /*查看随机数值是否在中奖范围内，在范围内说明中奖*/
            if (num<=count.intValue()){
                return entity;
            }
        }
        return null;
    }

    public static void main(String[] args) {
        MallGoodsToActivityEntity g1 =new MallGoodsToActivityEntity();
        g1.setId("123");
        g1.setProbability(new BigDecimal("26"));
        MallGoodsToActivityEntity g2 =new MallGoodsToActivityEntity();
        g2.setId("124");
        g2.setProbability(new BigDecimal("26"));
        MallGoodsToActivityEntity g3 =new MallGoodsToActivityEntity();
        g3.setId("128");
        g3.setProbability(new BigDecimal("26"));
        //List<MallGoodsToActivityEntity> list = Arrays.asList(g1,g2,g3,g4);
        List<MallGoodsToActivityEntity> list = new ArrayList<>();
        list.add(g1);
        list.add(g3);
        list.add(g2);

        RuleAbstract drawUtil =new DrawGoodsUtil(list);

        MallGoodsToActivityEntity draw = drawUtil.getEntity();
        System.out.println(draw.getId());
        System.out.println("======");

        drawUtil.delEntity(draw);
        System.out.println(drawUtil.getEntity().getId());

    }

}
